#include <iostream>
#include <memory>



class Person
{

public:
    Person()
    {
        std::cout<<" 构造函数 \n";
    }
    ~Person()
    {
        std::cout<<" 析构函数 \n";
    }
    void show()
    {
        std::cout<<"hello"<<std::endl;
    }
};

// template<typename T>
// class SmartPoint
// {
// public:
//     SmartPoint(T * p):p(p){}
//     ~SmartPoint()
//     {
//         delete p;
//     }

// private:
//     Person * p;
// };

// class Student
// {

// public:
//     Student()
//     {
//         std::cout<<" 构造函数 \n";
//     }
//     ~Student()
//     {
//         std::cout<<" 析构函数 \n";
//     }

// };
int main()
{
    //独占指针:不允许拷贝构造和赋值运算符重载
    //在该指针不再指向该内存时，释放内存
    // std::unique_ptr<Person> p(new Person);
    // //std::unique_ptr<Person> p1 = p;
    // //SmartPoint<Student> p(new Student);
    // p = std::make_unique<Person>();
    // while(1);

    //共享指针
    //多个指针指向同一个对象
    //当最后一个指针不再指向该内存，则内存释放
    std::shared_ptr<Person> ptr = std::make_shared<Person>();
    std::shared_ptr<Person> ptr2 = ptr;
    std::shared_ptr<Person> ptr3 = ptr2;

    ptr3 = nullptr;
    //引用计数器
    std::cout<<ptr.use_count()<<std::endl;

    (*ptr).show();
    ptr->show();//用法和普通指针一样

    //裸指针：不能释放，释放就会段错误
    Person * p = ptr.get();
    return 0;
}